      BOI.22. (Servire). Un sistem de operare numit server trebuie s[
"serveasc[" mai muli clieni clasificai n k(1k20) grupuri. Fiecare astfel de
grup este identificat printr-un num[r ntreg pozitiv. Clienii fiec[rui grup au
asigurat[ cte o prioritate - un num[r pozitiv p(0p65000). Cu ct este mai
mic num[rul, cu att este mai mare prioritatea n interiorul grupului.
           Serverul lucreaz[ n pai. La fiecare pas 0,1 sau mai muli clieni solicit[
un serviciu. La un pas poate fi ndeplinit un singur serviciu (dac[ exist[ cerere);
toate celelalte cereri trebuie s[ atepte paii urm[tori.
           Servirea grupurilor este secvenial[ (n ordinea apariiei primului client din
grup) i ciclic[ (dup[ ce s-a servit un client din fiecare grup, serverul se ntoarce
la primul grup servit .a.m.d.). Dac[ ntre timp apare primul client al unui nou grup,
el este servit imediat i grupul lui este inserat la locul lui n ciclul grupurilor,
conform regulilor de servire.
           Clienii unui grup sunt servii conform priorit[ii. Dac[ ntr-un grup apar
mai muli clieni cu prioritate egal[, primul venit este servit nti. Dac[ vin
simultan mai muli clieni cu prioritate egal[ din acelai grup, alegerea serverului
este arbitrar[.
Problem[:
           Se cere un program care s[ realizeze procesul de servire pas cu pas. La
fiecare pas, el trebuie s[:
 i) citeasc[ de la tastatur[ lista clienilor care cer serviciu la acest pas (lista vid[
dac[ nu exist[ clieni);
 ii) scrie pe ecran identificatorul clientului servit la acest pas.
Intrare: Lista clienilor se scrie pe o linie la intrare. Dac[ vin n clieni, linia const[
din 2n+1 numere ntregi separate printr-un spaiu: nti num[rul n, apoi 2n numere
grupate n perechi num[r-grup prioritate pentru fiecare client. Lista vid[
const[ din cifra 0 la nceputul liniei. Dac[ primul num[r de pe linie este -1, datele
de intrare s-au terminat. De exemplu:
4 15 7 2 1 15 2 2 10
0
0
0
0
1 2 1
-1
Ieire: La fiecare pas programul scrie pe o linie de ecran num[rul grupului i
prioritatea clientului servit la acest pas, precum i num[rul pasului n care clientul
a intrat n sistem. Dac[ nu sunt clieni de servit, se scrie pe ecran cifra 0. Pentru
intrarea din exemplul anterior, ieirea va fi:
15 2 1
2 1 1
15 7 1
2 10 1
2 1 5
===========================================
            BOI.22. (Mihai B[doiu)
program servire; 
const
        max=100;
var
        v: array[1..20] of record
                nr, n: integer;
                l: array[0..max] of record
                        prior,pas:integer;
                        end;
                end;
        vn: integer;
        vn_old: integer;
        sel: integer;
        pasg: integer;
----------------------------------------------------------
procedure insertl(a,b:integer);
var
        i,k:integer;
begin
   k:=0;
   for i:=1 to vn do
      if v[i].nr=a then begin k:=i; break end;
   if k=0 then begin
     inc(vn); k:=vn;
     v[k].n:=0; v[k].nr:=a; v[k].l[0].prior:=-maxint-1;
     v[k].l[0].pas:=pasg;
               end;
  inc(v[k].n); i:=v[k].n-1;
  for i:=v[k].n-1 downto 0 do
     if v[k].l[i].prior>b then begin
          v[k].l[i+1]:=v[k].l[i] end
                          else break;
  v[k].l[i+1].prior:=b;
  v[k].l[i+1].pas:=pasg;
end;
---------------------------------------------------------
procedure extrage(k:integer);
var
        i:integer;
begin
   for i:=1 to v[k].n do v[k].l[i]:=v[k].l[i+1];
   dec(v[k].n);
end;
-----------------------------------------------------
procedure select_out;
var
        i: integer;
begin
  if vn>vn_old then begin
     inc(vn_old);
     writeln(v[vn_old].nr:5,v[vn_old].l[1].prior:5,
        v[vn_old].l[1].pas:5);
     extrage(vn_old);
     exit;
                end;
  for i:=sel to vn do
    if v[i].n>0 then begin
 writeln(v[i].nr:5,v[i].l[1].prior:5,v[i].l[1].pas:5);
       extrage(i); sel:=i+1; exit;
                     end;
    for i:=1 to vn do
      if v[i].n>0 then begin
 writeln(v[i].nr:5,v[i].l[1].prior:5,v[i].l[1].pas:5);
        extrage(i); sel:=i+1; exit;
                       end;
end;
---------------------------------------------
procedure calcul;
var
        f:text;
        a,b,i,n:integer;
begin
  sel:=1; pasg:=1;
  assign(f,'p6.in'); reset(f);
  repeat
    read(f,n);
    for i:=1 to n do begin
       read(f,a,b); insertl(a,b); end;
       select_out; inc(pasg);
       readln(f);
  until n=-1;
  close(f);
end;
---------------------------------------------------------
begin
   writeln;
   calcul;
end.
----------------------------------------------
